package com.crcode.crm.service.user.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.crcode.crm.bean.user.UserBean;
import com.crcode.crm.dao.user.UserDao;
import com.crcode.crm.service.user.UserService;
import com.crcode.crm.utils.Object2Map;
import com.crcode.crm.utils.PageVo;
import com.crcode.crm.utils.ResultPageUtil;

/**
 * 用户业务实现层
 * @author lxw
 * @date 2018年8月26日 下午1:56:43
 * @version V1.0
 */
@Service(value="userService")
@Transactional
public class UserServiceImpl implements UserService {

	@Autowired
	private UserDao userDao;
	
	@Override
	public UserBean getById(Integer serializable) {
		
		return this.userDao.findById(serializable).get();
	}

	@Override
	public UserBean saveResultBean(UserBean t) {

		return this.userDao.save(t);
	}

	@Override
	public boolean saveResultBoolean(UserBean t) {
		try {
			this.userDao.save(t);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public UserBean updateResultBean(UserBean t) {
		
		return this.userDao.save(t);
	}

	@Override
	public boolean updateResultBoolean(UserBean t) {
		try {
			this.userDao.save(t);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public boolean delete(Integer serializable) {

		try {
			this.userDao.deleteById(serializable);;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public List<UserBean> getAll() {
		return this.userDao.findAll();
	}
	/**
	 * 根据程序序号查询
	 * @author lxw
	 * @date 2018年8月29日 下午3:30:05
	 * @param userXh
	 * @return
	 */
	@Override
	public UserBean findByUuid(String uuid){
		
		return this.userDao.findByUuid(uuid);
	}
	/**
	 * 根据用户登录名 查询用户
	 * @author cl  
	 * @date 2018年8月27日 下午2:52:51
	 * @param loginName
	 * @return
	 */
	@Override
	public UserBean findByLoginName(String loginName) {
		return userDao.findByLoginName(loginName);
	}

	/**
	 * 根据序号单一、批量删除返回操作结果数
	 * @author cl  
	 * @date 2018年8月27日 下午2:52:38
	 * @param ids
	 * @return
	 */
	@Override
	public boolean deleteUserByIds(List<Integer> ids) {
		try {
			this.userDao.deleteByIdIn(ids);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public boolean deleteUserByUuids(List<String> uuids) {
		try {
			this.userDao.deleteByUuidIn(uuids);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	/**
	 * 根据序号集 查询数据集
	 * @author cl  
	 * @date 2018年8月27日 下午2:52:29
	 * @param ids
	 * @return
	 */
	@Override
	public List<UserBean> findByUserIdIn(List<Integer> ids) {
		return userDao.findByIdIn(ids);
	}

	/**
	 * 根据实体字段分页查询
	 * @author cl  
	 * @date 2018年8月27日 下午2:58:49
	 * @param u
	 * @param vo
	 * @return
	 */
	@Override
	public ResultPageUtil findAll(UserBean u, PageVo vo) {
		Integer pageIndex = vo.getPageIndex() - 1;
		Pageable pageable =null;
		if(StringUtils.isNotEmpty(vo.getOrderBy())){
			if(vo.getOrderDesc()==1){
				pageable = PageRequest.of(pageIndex, vo.getPageSize(),Direction.ASC, vo.getOrderBy());
			}else if(vo.getOrderDesc()==0){
				pageable = PageRequest.of(pageIndex, vo.getPageSize(),Direction.ASC, vo.getOrderBy());
			}	
		}else{
			pageable = PageRequest.of(pageIndex, vo.getPageSize());
		}
		Page<UserBean> page = userDao.findAll(spec(u), pageable);
		ResultPageUtil rpu = new ResultPageUtil();
		rpu.setCurrentPage(vo.getPageIndex());
		rpu.setPageSize(vo.getPageSize());
		rpu.setTotalPages(page.getTotalPages());
		rpu.setRows(page.getContent());
		rpu.setTotal(page.getTotalElements());
		return rpu;
	}
	
	/**
	 * 创建动态查询条件组合
	 * @author cl  
	 * @date 2018年8月27日 下午2:59:37
	 * @param u
	 * @return
	 */
    private Specification<UserBean> spec(final UserBean u) {
        Specification<UserBean> spec = new Specification<UserBean>() {
			
        	private static final long serialVersionUID = 1L;

			@Override
			public Predicate toPredicate(Root<UserBean> root, CriteriaQuery<?> criteriaQuery,
					CriteriaBuilder cb) {
				List<Predicate> predicates = new ArrayList<>();
				if (StringUtils.isNotEmpty(u.getLoginName())) {
					predicates.add(cb.or(cb.like(root.get("loginName"), "%" +u.getLoginName()+ "%"),
							cb.like(root.<String> get("userRealName"), "%" +u.getUserRealName()+ "%")));
				}
				return cb.and(predicates.toArray(new Predicate[predicates.size()]));
			}
		};
        return spec;
    }
    /**
     * 查询用户列表 
     * @author lxw
     * @date 2019年4月1日
     * @param isUse 1、可以，0、不可用
     * @return
     */
    @Override
    public List<Map<String, Object>> loadUserByIsUse(Integer isUse){
    	List<Map<String, Object>> li = new ArrayList<>();
    	List<UserBean> ul = this.userDao.findByIsUse(isUse);
    	for (UserBean user : ul) {
    		if(user.getLoginName().toLowerCase().equals("admin")){
    			continue;
    		}
			Map<String, Object> obj = Object2Map.object2Map(user);
			obj.put("label", user.getUserRealName());
			obj.put("value", user.getUuid());
			li.add(obj);
		}
    	return li;
    }
}
